﻿package com.x.xdweb.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;



public class DateUtil {
	/**
	 * 日期格式为{@value},例如:"200408";
	 */
	public static final String DATE_STYLE1 = "yyyyMM";

	/**
	 * 日期格式为{@value},例如:"20040823";
	 */
	public static final String DATE_STYLE2 = "yyyyMMdd";

	/**
	 * 日期格式为"yyyy年MM月dd日 星期X",例如:"2006年05月26日 星期五";
	 */
	public static final String DATE_STYLE3 = "yyyy年MM月dd日 E";

	/**
	 * 日期格式为{@value},例如:"2006-05-26";
	 */
	public static final String DATE_STYLE4 = "yyyy-MM-dd";

	/**
	 * 日期格式为{@value},例如:"2006-05-26 17:11:01";
	 */
	public static final String DATE_STYLE5 = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 日期格式为{@value},例如:"2006.05.26";
	 */
	public static final String DATE_STYLE6 = "yyyy.MM.dd";
	
	/**
	 * 日期格式为"yyyy年MM月dd日 星期X",例如:"2006年05月26日 ";
	 */
	public static final String DATE_STYLE7 = "yyyy年MM月dd日 ";

	/**
	 * 所属期起日;
	 */
	public static final String SSSQ_Q = "qq";

	/**
	 * 所属期之日;
	 */
	public static final String SSSQ_Z = "qz";


	public static final String DATE_START = "STARTDATE";
	/**
	 * 获取当前日期字符串;<br>
	 * 
	 * @param style
	 *            日期样式;目前预定义的样式有:<br>
	 *            {@link #DATE_STYLE1}:日期格式为"yyyyMM";<br>
	 *            {@link #DATE_STYLE2}:日期格式为"yyyyMMdd";<br>
	 *            {@link #DATE_STYLE3}:日期格式为"yyyy年MM月dd日 星期X";<br>
	 *            {@link #DATE_STYLE4}:日期格式为"yyyy-MM-dd";<br>
	 *            {@link #DATE_STYLE5}:日期格式为"yyyy-MM-dd HH:mm:ss";<br>
	 * @return String
	 * @author C.Chen
	 */
	public static String getDateStr(String style) {
		return getDateStr(style, new Date());
	}

	/**
	 * 获取指定日期的字符串日期;<br>
	 * 
	 * @param style
	 *            日期样式;目前预定义的样式有:<br>
	 *            {@link #DATE_STYLE1}:日期格式为"yyyyMM";<br>
	 *            {@link #DATE_STYLE2}:日期格式为"yyyyMMdd";<br>
	 *            {@link #DATE_STYLE3}:日期格式为"yyyy年MM月dd日 星期X";<br>
	 *            {@link #DATE_STYLE4}:日期格式为"yyyy-MM-dd";<br>
	 *            {@link #DATE_STYLE5}:日期格式为"yyyy-MM-dd HH:mm:ss";<br>
	 * @param date
	 *            指定的日期;
	 * @return String
	 * @author C.Chen
	 */
	public static String getDateStr(String style, Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(style, Locale.CHINA);
		return sdf.format(date);
	}

	/**
	 * 获取当前时间的上月的年、月;<br>
	 * 例如：当前日期为“20070313”，返回日期为“200702”
	 * 
	 * @return String 返回日期格式为"yyyyMM",例如:"200408";
	 * @author C.Chen
	 */
	public static String getLastMonth() {
		StringBuffer buff = new StringBuffer(10);
		Calendar calendar = Calendar.getInstance();
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH);
		// 为某年的一月份时
		if (month == 0) {
			year = year - 1;
			month = 12;
		}
		buff.append(year);
		buff.append((month < 10) ? "0" + month : "" + month);

		return buff.toString();
	}

	/**
	 * 解析指定日期字符串,获得日期类型的对象;
	 * 
	 * @param style
	 *            日期样式;目前预定义的样式有:<br>
	 *            {@link #DATE_STYLE1}:日期格式为"yyyyMM";<br>
	 *            {@link #DATE_STYLE2}:日期格式为"yyyyMMdd";<br>
	 *            {@link #DATE_STYLE3}:日期格式为"yyyy年MM月dd日 星期X";<br>
	 *            {@link #DATE_STYLE4}:日期格式为"yyyy-MM-dd";<br>
	 *            {@link #DATE_STYLE5}:日期格式为"yyyy-MM-dd HH:mm:ss";<br>
	 * @param dateStr
	 *            需要转换的日期字符串;
	 * @return Date
	 * @author C.Chen
	 */
	public static Date parseDate(String style, String dateStr) {
		Date date = null;
		SimpleDateFormat sdf = new SimpleDateFormat(style, Locale.CHINA);
		try {
			date = sdf.parse(dateStr);
		} catch (Exception e) {
			Logger.getInstance().error("转换日期异常", DateUtil.class, e);
		}

		return date;
	}

	/**
	 * 计算出某年某月的天数;
	 * 
	 * @param year
	 *            指定的年份，格式为"yyyy";
	 * @param month
	 *            指定的月份，格式为"MM";
	 * @return int 指定月份的天数;
	 * @author C.Chen
	 */
	public static int getDaysOfMonth(String yyyy, String mm) {
		int year = Integer.parseInt(yyyy);
		int month = Integer.parseInt(mm);

		return getDaysOfMonth(year, month);
	}

	/**
	 * 计算出某年某月的天数;
	 * 
	 * @param year
	 *            指定的年份;
	 * @param month
	 *            指定的月份;
	 * @return int 指定月份的天数;
	 * @author C.Chen
	 */
	public static int getDaysOfMonth(int year, int month) {
		int monthCount = 0;
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			monthCount = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			monthCount = 30;
			break;
		case 2:
			if (((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0) {
				monthCount = 29;
			} else {
				monthCount = 28;
			}
			break;
		}

		return monthCount;
	}

	/**
	 * 获取指定日期之前（一定天数）的日期;
	 * 
	 * @param date
	 *            指定的日期;
	 * @param preDays
	 *            指定日期之前的天数;
	 * @return Date
	 * @author C.Chen
	 */
	public static Date getBeforeDate(Date date, int days) {
		String tempDate = getDateStr(DATE_STYLE2, date);

		int yyyy = Integer.parseInt(tempDate.substring(0, 4));
		int mm = Integer.parseInt(tempDate.substring(4, 6));
		int dd = Integer.parseInt(tempDate.substring(6, 8));

		dd = dd - days;
		while (dd <= 0) {
			if (mm == 1) {
				yyyy = yyyy - 1;
				mm = 12;
			} else {
				mm = mm - 1;
			}

			dd = dd + getDaysOfMonth(yyyy, mm);
		}

		StringBuffer buff = new StringBuffer(10);
		buff.append(yyyy);
		buff.append((String.valueOf(mm).length() == 1) ? "0" + mm : String.valueOf(mm));
		buff.append((String.valueOf(dd).length() == 1) ? "0" + dd : String.valueOf(dd));

		return parseDate(DATE_STYLE2, buff.toString());
	}

	/**
	 * 获取指定日期之后（一定天数）的日期;
	 * 
	 * @param date
	 *            指定的日期;
	 * @param preDays
	 *            指定日期之后的天数;
	 * @return Date
	 * @author C.Chen
	 */
	public static Date getAfterDate(Date date, int days) {
		String tempDate = getDateStr(DATE_STYLE2, date);

		int yyyy = Integer.parseInt(tempDate.substring(0, 4));
		int mm = Integer.parseInt(tempDate.substring(4, 6));
		int dd = Integer.parseInt(tempDate.substring(6, 8));

		dd = dd + days;
		while (dd > getDaysOfMonth(yyyy, mm)) {
			if (mm == 12) {
				yyyy = yyyy + 1;
				mm = 1;
			} else {
				mm = mm + 1;
			}

			if (mm == 1)
				dd = dd - getDaysOfMonth(yyyy - 1, 12);
			else
				dd = dd - getDaysOfMonth(yyyy, mm - 1);
		}

		StringBuffer buff = new StringBuffer(10);
		buff.append(yyyy);
		buff.append((String.valueOf(mm).length() == 1) ? "0" + mm : String.valueOf(mm));
		buff.append((String.valueOf(dd).length() == 1) ? "0" + dd : String.valueOf(dd));

		return parseDate(DATE_STYLE2, buff.toString());
	}

	/**
	 * 将日期字符串由8位("yyyyMMdd")转换为10位("yyyy-MM-dd");
	 * 
	 * @param rq
	 *            8位的字符串日期;
	 * @return String 10位的字符串日期,如果转换错误将返回NULL;
	 */
	public static String getRq8To10(String rq) {
		String result = null;
		if (rq.length() == 10) {
			return rq;
		}
		if (rq.length() == 8) {
			result = rq.substring(0, 4) + "-" + rq.substring(4, 6) + "-" + rq.substring(6, 8);
		}
		return result;
	}

	/**
	 * 将日期字符串由10位("yyyy-MM-dd")转换为8位("yyyyMMdd");
	 * 
	 * @param rq
	 *            10位的字符串日期;
	 * @return String 8位的字符串日期,如果转换错误将返回NULL;
	 * @author C.Chen
	 */
	public static String getRq10To8(String rq) {
		String result = null;
		if (rq.length() == 8) {
			return rq;
		}
		if (rq.length() == 10) {
			result = rq.substring(0, 4) + rq.substring(5, 7) + rq.substring(8, 10);
		}
		return result;
	}
}
